package A_java语言的新特性.a.接口的默认方法与静态方法;

import java.util.function.Supplier;

/**
 * Created by Administrator on 2017/3/10.
 */
public class Main {

    /**
     * Java 8用默认方法与静态方法这两个新概念来扩展接口的声明。
     * 默认方法使接口有点像Traits（Scala中特征(trait)类似于Java中的Interface，
     * 但它可以包含实现代码，也就是目前Java8新增的功能），但与传统的接口又有些不一样，
     * 它允许在已有的接口中添加新方法，而同时又保持了与旧版本代码的兼容性。
     * <p>
     * 默认方法与抽象方法不同之处在于抽象方法必须要求实现，但是默认方法则没有这个要求。
     * 相反，每个接口都必须提供一个所谓的默认实现，这样所有的接口实现者将会默认继承它（
     *      如果有必要的话，可以覆盖这个默认实现）。
     * 让我们看看下面的例子：
     */
    private interface Defaultable {
        default String notRequired() {
            return "Default Implementation";
        }
    }

    private static class DefaultableImpl implements Defaultable {

    }

    private static class OverridableImpl implements Defaultable {
        @Override
        public String notRequired() {
            return "Overridden Implementation";
        }
    }
    /**
     * Defaultable接口用关键字default声明了一个默认方法notRequired()，
     * Defaultable接口的实现者之一DefaultableImpl实现了这个接口，并且让默认方法保持原样。
     * Defaultable接口的另一个实现者OverridableImpl用自己的方法覆盖了默认方法。
     */


    //======================================================

    /**
     * Java 8带来的另一个有趣的特性是接口可以声明（并且可以提供实现）静态方法。例如：
     */
    private interface DefaultableFactory {
        //接口中允许出现静态方法
        static Defaultable create(Supplier<Defaultable> supplier) {
            return supplier.get();
        }
    }

    /**
     * 下面的一小段代码片段把上面的默认方法与静态方法黏合到一起。
     */
    public static void main(String[] args) {
        Defaultable defaultable = DefaultableFactory.create(DefaultableImpl :: new);//new DefaultableImpl();
        System.out.println(defaultable.notRequired());

        defaultable = DefaultableFactory.create(OverridableImpl :: new);
        System.out.println(defaultable.notRequired());
    }

}
